package model

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
	"time"
)

// TableConfig 表格配置模型
type TableConfig struct {
	BaseModel
	Name           string     `json:"name" gorm:"type:varchar(100);not null;comment:配置名称"`
	Description    string     `json:"description" gorm:"type:text;comment:配置描述"`
	DataPermission bool       `json:"dataPermission" gorm:"default:false;comment:是否开启数据权限"`
	Fields         FormFields `json:"fields" gorm:"type:json;not null;comment:字段配置JSON"`
	TableFields    FormFields `json:"tableFields" gorm:"type:json;comment:表格字段配置JSON"`
}

// TableName 指定表名
func (TableConfig) TableName() string {
	return "table_configs"
}

// FormField 表单字段结构
type FormField struct {
	Id            string      `json:"id"`
	Type          string      `json:"type"`
	Label         string      `json:"label"`
	Name          string      `json:"name"`
	Required      bool        `json:"required"`
	ShowInTable   bool        `json:"showInTable,omitempty"`
	TableWidth    int         `json:"tableWidth,omitempty"`
	OptionSource  string      `json:"optionSource,omitempty"` // manual | api
	ApiUrl        string      `json:"apiUrl,omitempty"`
	ApiMethod     string      `json:"apiMethod,omitempty"`
	ApiDataPath   string      `json:"apiDataPath,omitempty"`
	ApiLabelField string      `json:"apiLabelField,omitempty"`
	ApiValueField string      `json:"apiValueField,omitempty"`
	Options       []Option    `json:"options,omitempty"`
	DefaultValue  interface{} `json:"defaultValue,omitempty"`
	Placeholder   string      `json:"placeholder,omitempty"`
}

// Option 选项结构
type Option struct {
	Label string      `json:"label"`
	Value interface{} `json:"value"`
}

// FormFields 自定义类型，用于GORM JSON序列化
type FormFields []FormField

// Value 实现driver.Valuer接口，用于GORM存储到数据库
func (f FormFields) Value() (driver.Value, error) {
	if len(f) == 0 {
		return "[]", nil
	}
	b, err := json.Marshal(f)
	if err != nil {
		return nil, err
	}
	return string(b), nil
}

// Scan 实现sql.Scanner接口，用于GORM从数据库读取
func (f *FormFields) Scan(value interface{}) error {
	if value == nil {
		*f = FormFields{}
		return nil
	}

	var bytes []byte
	switch v := value.(type) {
	case []byte:
		bytes = v
	case string:
		bytes = []byte(v)
	default:
		return fmt.Errorf("cannot scan %T into FormFields", value)
	}

	if len(bytes) == 0 {
		*f = FormFields{}
		return nil
	}

	return json.Unmarshal(bytes, f)
}

// DynamicTableData 动态表格数据基础结构
type DynamicTableData struct {
	Id         uint                   `json:"id" gorm:"primaryKey;autoIncrement"`
	Data       map[string]interface{} `json:"data" gorm:"-"` // 不存储到数据库，用于传输
	CreateTime time.Time              `json:"create_time" gorm:"autoCreateTime;comment:创建时间"`
	UpdateTime time.Time              `json:"update_time" gorm:"autoUpdateTime;comment:更新时间"`
}

// TableName 动态生成表名
func (d *DynamicTableData) TableName(configName string) string {
	return "dynamic_table_" + configName
}

type DynamicPrivilegeUser struct {
	DataId        uint64 `json:"dataId" gorm:"type:bigint(20) unsigned;column:data_id;comment:'数据ID'"`
	UserId        uint64 `json:"userId" gorm:"type:bigint(20) unsigned;column:user_id;comment:'用户ID'"`
	TableConfigId uint64 `json:"tableConfigId" gorm:"type:bigint(20) unsigned;column:table_config_id;comment:'表格配置ID'"`
}

type DynamicPrivilegeRole struct {
	DataId        uint64 `json:"dataId" gorm:"type:bigint(20) unsigned;column:data_id;comment:'数据ID'"`
	RoleId        uint64 `json:"roleId" gorm:"type:bigint(20) unsigned;column:role_id;comment:'角色ID'"`
	TableConfigId uint64 `json:"tableConfigId" gorm:"type:bigint(20) unsigned;column:table_config_id;comment:'表格配置ID'"`
}
